{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "WARNING:tensorflow:From /opt/anaconda3/lib/python3.7/site-packages/tensorflow_core/python/compat/v2_compat.py:65: disable_resource_variables (from tensorflow.python.ops.variable_scope) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "non-resource variables are not supported in the long term\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "import tensorflow.compat.v1 as tf\n",
    "tf.disable_v2_behavior()\n",
    "from tensorflow.examples.tutorials.mnist import input_data\n",
    "from matplotlib import pyplot as plt\n",
    "# TensorFlow 日志信息输出到屏幕\n",
    "tf.logging.set_verbosity(tf.logging.INFO)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "WARNING:tensorflow:From <ipython-input-2-658d77025f1f>:1: read_data_sets (from tensorflow.examples.tutorials.mnist.input_data) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Please use alternatives such as: tensorflow_datasets.load('mnist')\n",
      "WARNING:tensorflow:From /opt/anaconda3/lib/python3.7/site-packages/tensorflow_core/examples/tutorials/mnist/input_data.py:297: _maybe_download (from tensorflow.examples.tutorials.mnist.input_data) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Please write your own downloading logic.\n",
      "WARNING:tensorflow:From /opt/anaconda3/lib/python3.7/site-packages/tensorflow_core/examples/tutorials/mnist/input_data.py:299: _extract_images (from tensorflow.examples.tutorials.mnist.input_data) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Please use tf.data to implement this functionality.\n",
      "Extracting ./train-images-idx3-ubyte.gz\n",
      "WARNING:tensorflow:From /opt/anaconda3/lib/python3.7/site-packages/tensorflow_core/examples/tutorials/mnist/input_data.py:304: _extract_labels (from tensorflow.examples.tutorials.mnist.input_data) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Please use tf.data to implement this functionality.\n",
      "Extracting ./train-labels-idx1-ubyte.gz\n",
      "Extracting ./t10k-images-idx3-ubyte.gz\n",
      "Extracting ./t10k-labels-idx1-ubyte.gz\n",
      "WARNING:tensorflow:From /opt/anaconda3/lib/python3.7/site-packages/tensorflow_core/examples/tutorials/mnist/input_data.py:328: _DataSet.__init__ (from tensorflow.examples.tutorials.mnist.input_data) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Please use alternatives such as official/mnist/_DataSet.py from tensorflow/models.\n",
      "1\n",
      "(55000, 784)\n",
      "(55000,)\n",
      "2\n",
      "(5000, 784)\n",
      "(5000,)\n",
      "3\n",
      "(10000, 784)\n",
      "(10000,)\n"
     ]
    }
   ],
   "source": [
    "mnist = input_data.read_data_sets('./')\n",
    "\n",
    "print(1)\n",
    "print(mnist.train.images.shape)\n",
    "print(mnist.train.labels.shape)\n",
    "print(2)\n",
    "print(mnist.validation.images.shape)\n",
    "print(mnist.validation.labels.shape)\n",
    "print(3)\n",
    "print(mnist.test.images.shape)\n",
    "print(mnist.test.labels.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x576 with 16 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "#设置单元格大小\n",
    "plt.figure(figsize=(8,8))\n",
    "\n",
    "for idx in range(16):\n",
    "    plt.subplot(4,4,idx +1)\n",
    "    plt.axis('off')#不显示坐标尺寸\n",
    "    plt.title('{}'.format(mnist.train.labels[idx]))\n",
    "    plt.imshow(mnist.train.images[idx].reshape( (28,28) ))\n",
    "    "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "接下来定义用于训练的网络，首先定义网络的输入\n",
    "\n",
    "这里我们直接使用上面的数据作为输入，\n",
    "定义两个placeholder用于图像和label数据，定义一个float设置学习率\n",
    "\n",
    "为了让网络更高效的运行，多个数据会被组织成一个batch送入网络，两个placeholder的第一个维度就是batchsize"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [],
   "source": [
    "def get_weight(shape,lambda1):\n",
    "    var = tf.Variable(tf.truncated_normal(shape, stddev= 0.1) )\n",
    "    tf.add_to_collection('losses',tf.keras.regularizers.l2(lambda1)(var))\n",
    "    return var\n",
    "    \n",
    "\n",
    "x = tf.placeholder('float',[None,784])\n",
    "y = tf.placeholder('int64',[None])\n",
    "learning_rate = tf.placeholder('float') \n",
    "#shape 1 维整形张量或 array 输出张量维度,stddev 正态分布标准差\n",
    "def initialize(shape,stddev = 0.1):\n",
    "#     产生截断正态分布随机数，取值范围为 [ mean - 2 * stddev, mean + 2 * stddev ]。\n",
    "    return tf.truncated_normal(shape,stddev = 0.1)\n",
    "\n",
    "#循环生成网络结构\n",
    "\n",
    "#定义每层神经元个数\n",
    "units_count = [784,500,200,100,10]\n",
    "\n",
    "lenut = len(units_count)\n",
    "#初始值\n",
    "cur_layer = x\n",
    "in_count = units_count[0]\n",
    "\n",
    "\n",
    "for i in range(1, lenut):\n",
    "    out_count = units_count[i]\n",
    "    weight = get_weight([in_count,out_count],0.004)\n",
    "    bias = tf.Variable(initialize([out_count]))\n",
    "    logits_i = tf.matmul(cur_layer,weight) +bias\n",
    "    cur_layer= tf.keras.activations.relu(logits_i)\n",
    "#     cur_layer = tf.nn.relu(logits_i)\n",
    "    in_count = out_count\n",
    "\n",
    "logits = cur_layer\n",
    "# L1_units_count = 100\n",
    "# W_1 = tf.Variable(initialize( [784, L1_units_count]))\n",
    "# b_1 = tf.Variable(initialize([L1_units_count]))\n",
    "# #得到一个新的矩阵\n",
    "\n",
    "# logits_1 = tf.matmul(x,W_1) + b_1\n",
    "# # 计算激活函数 relu，即 max(features, 0)。将大于0的保持不变，小于0的数置为0。\n",
    "# output_1 = tf.nn.relu(logits_1)\n",
    "\n",
    "# L2_units_count = 10\n",
    "# W_2 = tf.Variable(initialize([L1_units_count,L2_units_count]))\n",
    "# b_2 = tf.Variable(initialize([L2_units_count]))\n",
    "# logits_2 = tf.matmul(output_1,W_2) +b_2\n",
    "\n",
    "\n",
    "#定义一个获取权重，并自动加入正则项到损失的函数\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "接下来定义loss和用于优化网络的优化器sparse_softmax_cross_entropy_with_logits, 这样做的好处是labels可以不用手动做one_hot省了一些麻烦。这里使用了sgd优化器，学习率为可以根据需要设定。\n",
    "试试看，增大减小学习率，换个优化器再进行训练会发生什么\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 降维或者计算tensor（图像）的平均值。#交叉熵损失\n",
    "cross_entropy_loss = tf.reduce_mean(\n",
    "    tf.nn.sparse_softmax_cross_entropy_with_logits(logits = logits,labels = y,))\n",
    "#梯度下降法GD SGD BGD\n",
    "optimizer = tf.train.GradientDescentOptimizer(\n",
    "    learning_rate=learning_rate).minimize(cross_entropy_loss)\n",
    "# Adagrad适用于数据稀疏或者分布不平衡的数据集\n",
    "optimizer1 = tf.train.AdagradOptimizer(learning_rate=learning_rate).minimize(cross_entropy_loss)\n",
    "#动量梯度下降法\n",
    "optimizer2 = tf.train.MomentumOptimizer(learning_rate=learning_rate,momentum=0.7,use_nesterov=True).minimize(cross_entropy_loss)\n",
    "# 实现 Adam优化算法（  Adam 这个名字来源于 adaptive moment estimation，自适应矩估计。）#需要较小的学习率\n",
    "optimizer3 = tf.train.AdamOptimizer(learning_rate= learning_rate).minimize(cross_entropy_loss)\n",
    "optimizer4 = tf.train.AdadeltaOptimizer(learning_rate=learning_rate).minimize(cross_entropy_loss)\n",
    "optimizer5 = tf.train.RMSPropOptimizer(learning_rate=learning_rate).minimize(cross_entropy_loss)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "需要注意的是，上面的网络，最后输出的是未经softmax的原始logits，而不是分布概率，要想看到概率分布，还需要做一下softmax \n",
    "将输出结果与正确结果进行比对，即可得到我们的网络输出结果的准确率"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 该样本属于各个类的概率\n",
    "pred = tf.nn.softmax(logits)\n",
    "#argmax 取出最大值 1 获取行索引 0 获取列索引\n",
    "correct_pred = tf.equal(tf.argmax(pred,1),y)\n",
    "#tf.cast张量数据类型转换\n",
    "# tf.reduce_mean 函数用于计算张量tensor沿着指定的数轴（tensor的某一维度）上的的平均值，主要用作降维或者计算tensor（图像）的平均值。\n",
    "accuracy = tf.reduce_mean(tf.cast(correct_pred,tf.float32))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "saver用于保存或者恢复训练的模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [],
   "source": [
    "batch_size =32\n",
    "trainig_step = 1000\n",
    "\n",
    "saver = tf.train.Saver()"
   ]
  },
  {
   "cell_type": "raw",
   "metadata": {},
   "source": [
    "以上定义的所有操作，均为计算图，也就是仅仅是定义了网络的结构，实际需要运行的话，还需要运行的话，还需要创建一个session，并将数据填入网络中"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "after 100 training steps, the loss is 1.33915, the validation accuracy is 0.7112\n",
      "after 200 training steps, the loss is 0.185902, the validation accuracy is 0.9066\n",
      "after 300 training steps, the loss is 0.371295, the validation accuracy is 0.9168\n",
      "after 400 training steps, the loss is 0.316882, the validation accuracy is 0.942\n",
      "after 500 training steps, the loss is 0.0835396, the validation accuracy is 0.9458\n",
      "after 600 training steps, the loss is 0.190442, the validation accuracy is 0.9528\n",
      "after 700 training steps, the loss is 0.214824, the validation accuracy is 0.9542\n",
      "after 800 training steps, the loss is 0.343691, the validation accuracy is 0.954\n",
      "after 900 training steps, the loss is 0.337252, the validation accuracy is 0.9516\n",
      "the training is finish!\n",
      "the test accuarcy is: 0.9507\n"
     ]
    }
   ],
   "source": [
    "with tf.Session() as sess:\n",
    "    # 必须要使用global_variables_initializer的场合\n",
    "# 含有tf.Variable的环境下，因为tf中建立的变量是没有初始化的，也就是在debug时还不是一个tensor量，而是一个Variable变量类型\n",
    "    sess.run(tf.global_variables_initializer())\n",
    "\n",
    "    #定义验证集与测试集\n",
    "    validate_data = {\n",
    "        x: mnist.validation.images,\n",
    "        y: mnist.validation.labels,\n",
    "    }\n",
    "    test_data = {x: mnist.test.images, y: mnist.test.labels}\n",
    "    \n",
    "    for i in range(trainig_step):\n",
    "#         mnist.train.next_batch是专门用于由tensorflow提供的MNIST教程的函数。它的工作原理是在开始时将训练图像和标签对随机化，并在每次调用该函数时选择每个随后的batch_size张图像。一旦到达末尾，图像标签对将再次随机分配，并重复该过程。仅在使用所有可用对后，才重新组合和重复整个数据集。\n",
    "\n",
    "        xs, ys = mnist.train.next_batch(batch_size)\n",
    "        _, loss = sess.run(\n",
    "            [optimizer5, cross_entropy_loss],\n",
    "            feed_dict={\n",
    "                x: xs,\n",
    "                y: ys,\n",
    "                learning_rate: 0.001\n",
    "            })\n",
    "\n",
    "        #每100次训练打印一次损失值与验证准确率\n",
    "        if i > 0 and i % 100 == 0:\n",
    "            validate_accuracy = sess.run(accuracy, feed_dict=validate_data)\n",
    "            print(\n",
    "                \"after %d training steps, the loss is %g, the validation accuracy is %g\"\n",
    "                % (i, loss, validate_accuracy))\n",
    "            saver.save(sess, './model.ckpt', global_step=i)\n",
    "\n",
    "    print(\"the training is finish!\")\n",
    "    #最终的测试准确率\n",
    "    acc = sess.run(accuracy, feed_dict=test_data)\n",
    "    print(\"the test accuarcy is:\", acc)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "INFO:tensorflow:Restoring parameters from ./model.ckpt-900\n",
      "0.9375\n",
      "0.9996686\n",
      "0.99999976\n",
      "0.99811894\n",
      "0.99987996\n",
      "0.9823506\n",
      "0.9982095\n",
      "0.99880695\n",
      "0.9858131\n",
      "0.96879715\n",
      "0.98058885\n",
      "0.99961936\n",
      "0.9784863\n",
      "0.9964875\n",
      "0.9998292\n",
      "0.99981517\n",
      "0.9824515\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x576 with 16 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "with tf.Session() as sess:\n",
    "    #提取训练模型\n",
    "    ckpt = tf.train.get_checkpoint_state('./')\n",
    "    if ckpt and ckpt.model_checkpoint_path:\n",
    "        saver.restore(sess,ckpt.model_checkpoint_path)\n",
    "        final_pred, acc = sess.run(\n",
    "        [pred, accuracy],\n",
    "        feed_dict = {\n",
    "            x: mnist.test.images[:16],\n",
    "            y: mnist.test.labels[:16]\n",
    "        })\n",
    "        orders = np.argsort(final_pred)\n",
    "        plt.figure(figsize=(8,8))\n",
    "        print(acc)\n",
    "        \n",
    "        for idx in range(16):\n",
    "            order = orders[idx,:][-1]\n",
    "            prob = final_pred[idx, :][order]\n",
    "            print(prob)\n",
    "            \n",
    "            plt.subplot(4,4,idx+1)\n",
    "            plt.axis ('off')\n",
    "            plt.title('{}:[{}] - [{:.1f}%]'.format(mnist.test.labels[idx],order,prob *100))\n",
    "            plt.imshow(mnist.test.images[idx].reshape((28,28)))\n",
    "    else:\n",
    "        pass"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "raw",
   "metadata": {},
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
